package cn.duhengkui.national.valuelist.core.entity;

import java.util.HashMap;
import java.util.Map;

/**   
 * <table border="1">
 *	<tr><td>包名称：</td><td>cn.duhengkui.national.valuelist.core.entity</td></tr>
 *	<tr><td>类名称：</td><td>BaseObject</td></tr>
 *	<tr><td>类描述：</td><td>基础QO和Entity父类</td></tr>
 *	<tr><td>创建人：</td><td>杜恒奎</td></tr>
 *  <tr><td>创建时间：</td><td>2018年6月7日/下午5:04:00</td></tr> 
 *  <tr><td>版本：</td><td>1.0.0</td></tr>
 * </table>   
 *     
 */
public abstract class BaseObject implements java.io.Serializable{
	
	private static final long serialVersionUID = 6754845022027040846L;
	
	private Map<String, Object> keys = new HashMap<>(1);
	
	private Map<String, Object> extend = new HashMap<>(0);
	
	
	/**
	 * 获取所有扩展属性HashMap
	 * @return
	 */
	public Map<String, Object> getExtendProperties() {
		return extend;
	}
	
	/**
	 * 得到一个扩展属性值
	 * @param <E> 返回值需要根据数据库与JDBC类型对应
	 * @param name 字段名
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <E> E extend(String name) {
		return (E) extend.get(name);
	}
	
	/**
	 * 增加一个扩展属性
	 * @param key 字段名
	 * @param value 字段值
	 * @return
	 */
	public BaseObject addExtend(String key, Object value) {
		extend.put(key, value);
		return this;
	}
	
	/**
	 * 获取第一个条件字段值
	 * @param <E> 返回值需要根据数据库与JDBC类型对应
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <E> E key() {
		if(keys.isEmpty()) {
			return null;
		} else {
			return (E) ((keys.values().toArray())[0]);
		}
	}
	
	/**
	 * 获取一个条件字段值
	 * @param <E> 返回值需要根据数据库与JDBC类型对应
	 * @param name
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <E> E key(String name) {
		return (E) keys.get(name);
	}
	
	/**
	 * 获得一个条件HashMap
	 * @return
	 */
	public Map<String, Object> keys() {
		return keys;
	}
	
	/**
	 * 条件数量
	 * @return
	 */
	public int keySize() {
		return keys.size();
	}
	
	/**
	 * 增加一个条件用于查询
	 * @param <Entity> 实体对象
	 * @param key 字段名
	 * @param value 字段值
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <Entity extends BaseObject> Entity addKey(String key, Object value) {
		keys.put(key, value);
		return (Entity)this;
	}

}
